/*
 * TraceAst.h
 *
 *  Created on: 2012/06/07
 *      Author: guanxiaoying
 */

#ifndef TRACEAST_H_
#define TRACEAST_H_
#include "../../table/trace_ast_table.h"
/*  関数状態 */

#define FUNC_FINISHED  2
#define FUNC_TRACKING  1
#define FUNC_START		0

/*  スタック操作 */
#define STACK_PUSH	1
#define STACK_TEST	2
#define STACK_PULL	3

#define CONDEXP_TRUE	1
#define CONDEXP_FALSE	2
#define CONDEXP_VALUE	3
/* 最大回数 */
#define LP_CONTINUE_EXIST  0x0001
#define LP_BREAK_EXIST  0x0002
#define LP_EXEC_EVER   0x0004

#define EVT_STATEMENT				1
#define EVT_EXPRESSION				2
#define EVT_DECLARATION             4
#define EVT_DECLARATOR				8
#define EVT_INITIALIZER             16
#define EVT_PREEXPR                 32

typedef struct _CURRTRACEINFO
{
	U2			usKind;
	AST			astTable;
	AST			astTraceSub;
	AST			astNext;
} CURRTRACEINFO;
extern CURRTRACEINFO stCurrTraceInfo;

enum __OBJ_KIND_ENUMTAG{
	TR_KIND_NULL = 0,
	TR_KIND_TRANSLATIONUNIT,
	TR_KIND_EXPRESSION,
	TR_KIND_STATEMENT,
	TR_KIND_DECLARATION,
	TR_KIND_DECLARATOR,
	TR_KIND_TYPESPECIFIER,
	TR_KIND_INITIALIZER

};

extern U4 ulEquLeft;	/* イコールの左と右のフラグ */
extern U4 ulOpt ;    	/* トレースのオプション */
extern U4 lEvent ;   	/* 第1回か第2回のイベント */
extern U4 lEventSec ;    /* トレースの詳細イベント */
extern S4 (*pfunc)( U2, AST, U4 );  /*規約起動関数 */
extern AST gblSearchEffectPoint;
extern BOOL gblIsSearching;
extern CALLBACK_FUNCALL pTraceGetFuncInfo ;
/* TraceMain function prototype */

S4 TraceStack( U2 );
/* TraceStmt function prototype */
S4 TraceStmt( VOID );
S4 TraceExpEntry( VOID );
/* TraceExp function prototype */
S4 TraceExp( VOID );
S4 TraceDeclaration( VOID );
S4 TraceDeclarator( VOID );
S4 TraceInitExpList( VOID );
VOID TraceThrowWarning( U4 code, AST astCodeScp, PSZ pszParameter, ALERT_MSG_PARAM *szValue );
#endif /* TRACEAST_H_ */
